#!/bin/bash

# BGW App API 统一管理脚本
# 使用方法: 
#   ./bgw_app.sh start   - 启动服务
#   ./bgw_app.sh stop    - 停止服务
#   ./bgw_app.sh restart - 重启服务
#   ./bgw_app.sh status  - 查看状态
#   ./bgw_app.sh         - 默认执行重启

# 设置脚本目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"

# 配置参数
APP_NAME="BGW App API"
PID_FILE="bgw_app.pid"
LOG_FILE="bgw_app.log"
APP_SCRIPT="app.py"
PYTHON_ENV="/root/pyenv3_12/bin/activate"
PORT=8500

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 打印带颜色的消息
print_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

print_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 激活 Python 环境
activate_python_env() {
    print_info "激活 Python 环境..."
    source "$PYTHON_ENV"
    
    if [ -z "$VIRTUAL_ENV" ]; then
        print_error "Python 环境激活失败"
        exit 1
    fi
    
    print_success "Python 环境已激活: $VIRTUAL_ENV"
}

# 检查应用是否运行
is_running() {
    if [ -f "$PID_FILE" ]; then
        PID=$(cat "$PID_FILE")
        if ps -p "$PID" > /dev/null 2>&1; then
            return 0
        else
            # 清理无效的 PID 文件
            rm -f "$PID_FILE"
        fi
    fi
    return 1
}

# 启动应用
start_app() {
    print_info "启动 $APP_NAME..."
    
    # 激活 Python 环境
    activate_python_env
    
    # 检查是否已经在运行
    if is_running; then
        PID=$(cat "$PID_FILE")
        print_warning "$APP_NAME 已经在运行 (PID: $PID)"
        print_info "如需重启，请使用: ./bgw_app.sh restart"
        return 1
    fi
    
    # 检查应用脚本是否存在
    if [ ! -f "$APP_SCRIPT" ]; then
        print_error "应用脚本不存在: $APP_SCRIPT"
        exit 1
    fi
    
    # 启动应用
    print_info "启动应用进程..."
    nohup python3 "$APP_SCRIPT" > "$LOG_FILE" 2>&1 &
    PID=$!
    
    # 保存 PID
    echo "$PID" > "$PID_FILE"
    
    # 等待应用启动
    sleep 3
    
    # 检查启动状态
    if is_running; then
        print_success "$APP_NAME 启动成功 (PID: $PID)"
        print_info "日志文件: $LOG_FILE"
        print_info "PID 文件: $PID_FILE"
        print_info "访问地址: http://localhost:$PORT"
        
        # 检查端口监听
        if netstat -tlnp 2>/dev/null | grep -q ":$PORT.*$PID"; then
            print_success "端口 $PORT 正在监听"
        else
            print_warning "端口 $PORT 未监听，请检查日志"
        fi
    else
        print_error "$APP_NAME 启动失败"
        rm -f "$PID_FILE"
        print_info "请查看日志文件: $LOG_FILE"
        exit 1
    fi
}

# 停止应用
stop_app() {
    print_info "停止 $APP_NAME..."
    
    if ! is_running; then
        print_warning "$APP_NAME 未运行"
        return 1
    fi
    
    PID=$(cat "$PID_FILE")
    print_info "停止进程 $PID..."
    
    # 优雅停止
    kill "$PID"
    
    # 等待进程结束
    sleep 3
    
    # 检查是否还在运行
    if ps -p "$PID" > /dev/null 2>&1; then
        print_warning "进程仍在运行，强制终止..."
        kill -9 "$PID"
        sleep 2
        
        # 再次检查
        if ps -p "$PID" > /dev/null 2>&1; then
            print_error "无法停止进程 $PID"
            exit 1
        fi
    fi
    
    # 清理 PID 文件
    rm -f "$PID_FILE"
    print_success "$APP_NAME 已停止"
}

# 重启应用
restart_app() {
    print_info "重启 $APP_NAME..."
    
    # 先停止
    if is_running; then
        stop_app
        sleep 2
    fi
    
    # 再启动
    start_app
    print_success "重启完成"
}

# 查看状态
status_app() {
    print_info "检查 $APP_NAME 状态..."
    
    if ! is_running; then
        print_warning "状态: 未运行"
        return 1
    fi
    
    PID=$(cat "$PID_FILE")
    print_success "状态: 运行中"
    print_info "PID: $PID"
    print_info "启动时间: $(ps -o lstart= -p "$PID" 2>/dev/null || echo '未知')"
    print_info "内存使用: $(ps -o rss= -p "$PID" 2>/dev/null | awk '{print $1/1024 " MB"}' || echo '未知')"
    print_info "CPU 使用: $(ps -o %cpu= -p "$PID" 2>/dev/null || echo '未知')%"
    print_info "访问地址: http://localhost:$PORT"
    
    # 检查端口监听
    if netstat -tlnp 2>/dev/null | grep -q ":$PORT.*$PID"; then
        print_success "端口状态: $PORT 端口正在监听"
    else
        print_warning "端口状态: $PORT 端口未监听"
    fi
    
    # 显示最近的日志
    if [ -f "$LOG_FILE" ]; then
        print_info "最近日志 (最后10行):"
        tail -n 10 "$LOG_FILE" | sed 's/^/  /'
    fi
}

# 显示帮助信息
show_help() {
    echo "BGW App API 管理脚本"
    echo ""
    echo "使用方法:"
    echo "  $0 start   - 启动服务"
    echo "  $0 stop    - 停止服务"
    echo "  $0 restart - 重启服务 (默认)"
    echo "  $0 status  - 查看状态"
    echo "  $0 help    - 显示帮助"
    echo ""
    echo "示例:"
    echo "  $0          # 默认重启"
    echo "  $0 start    # 启动服务"
    echo "  $0 status   # 查看状态"
}

# 主函数
main() {
    case "${1:-restart}" in
        start)
            start_app
            ;;
        stop)
            stop_app
            ;;
        restart)
            restart_app
            ;;
        status)
            status_app
            ;;
        help|--help|-h)
            show_help
            ;;
        *)
            print_error "未知参数: $1"
            show_help
            exit 1
            ;;
    esac
}

# 执行主函数
main "$@"
